package com.example.project.service;

import java.util.List;

import com.example.project.entity.IssueNotification;

/**
 * 需求通知服务接口
 */
public interface IssueNotificationService {
    
    /**
     * 查询需求通知
     * 
     * @param id 需求通知主键
     * @return 需求通知
     */
    IssueNotification selectIssueNotificationById(Long id);
    
    /**
     * 查询需求通知列表
     * 
     * @param issueNotification 需求通知
     * @return 需求通知集合
     */
    List<IssueNotification> selectIssueNotificationList(IssueNotification issueNotification);
    
    /**
     * 根据用户ID查询未读通知数量
     * 
     * @param userId 用户ID
     * @return 未读通知数量
     */
    int selectUnreadCountByUserId(Long userId);
    
    /**
     * 根据用户ID查询通知列表
     * 
     * @param userId 用户ID
     * @param limit 返回数量限制
     * @return 通知列表
     */
    List<IssueNotification> selectNotificationsByUserId(Long userId, Integer limit);
    
    /**
     * 新增需求通知
     * 
     * @param issueNotification 需求通知
     * @return 结果
     */
    int insertIssueNotification(IssueNotification issueNotification);
    
    /**
     * 修改需求通知
     * 
     * @param issueNotification 需求通知
     * @return 结果
     */
    int updateIssueNotification(IssueNotification issueNotification);
    
    /**
     * 批量删除需求通知
     * 
     * @param ids 需要删除的需求通知主键
     * @return 结果
     */
    int deleteIssueNotificationByIds(Long[] ids);
    
    /**
     * 删除需求通知信息
     * 
     * @param id 需求通知主键
     * @return 结果
     */
    int deleteIssueNotificationById(Long id);
    
    /**
     * 标记通知为已读
     * 
     * @param id 通知ID
     * @return 结果
     */
    int markAsRead(Long id);
    
    /**
     * 批量标记通知为已读
     * 
     * @param ids 通知ID列表
     * @return 结果
     */
    int markAsReadBatch(Long[] ids);
    
    
    /**
     * 发送评论通知
     * 
     * @param issueId 需求ID
     * @param commenterId 评论者ID
     * @param commentContent 评论内容
     * @param receiverIds 接收者ID列表
     * @return 结果
     */
    boolean sendCommentNotification(Long issueId, Long commenterId, String commentContent, List<Long> receiverIds);
    
    /**
     * 发送状态变更通知
     * 
     * @param issueId 需求ID
     * @param operatorId 操作者ID
     * @param statusFrom 原始状态
     * @param statusTo 新状态
     * @param receiverIds 接收者ID列表
     * @return 结果
     */
    boolean sendStatusChangeNotification(Long issueId, Long operatorId, String statusFrom, String statusTo, List<Long> receiverIds);
    
    /**
     * 发送分配通知
     * 
     * @param issueId 需求ID
     * @param operatorId 操作者ID
     * @param assigneeId 被分配者ID
     * @return 结果
     */
    boolean sendAssignmentNotification(Long issueId, Long operatorId, Long assigneeId);
}